Skip to content

refactor(spec,client,metadata-protocol,runtime)!: 退役 workflow 服务槽位与 graphql 残留 (#4451) - #4473

Merged
os-zhuang merged 5 commits into
mainfrom
claude/discovery-cache-queue-route-conflict-8fwmfc
Aug 1, 2026
Merged

os-zhuang merged 5 commits into
mainfrom
claude/discovery-cache-queue-route-conflict-8fwmfc

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Closes #4451.

维护者判断:workflow 的能力"是 automation 还是 approval,应该都有了",确认是旧设计、无业务价值 → 在 v17 一并退役#4451 提的两条残留在这个 PR 里一起清掉。

为什么是退役而不是补实现

workflow 是 ADR-0078 那种"声明了、从未实现"的形态,而且是每一层同时如此:

  • CoreServiceName 'workflow' —— 从没有任何东西注册或解析这个槽位。ADR-0115 Evidence 5 双仓核实过:"no code in this repository resolves either slot",唯一的触碰是 plugin-dev 那张已退役的 stub 表和通用 discovery 遍历;
  • IWorkflowService(87 行契约)—— 零实现;
  • WorkflowProtocol 的三个方法 —— 没有任何代码提供;
  • ApiRoutes.workflow —— 没有 builder 能如实填充;
  • /api/v1/workflow —— 没有任何 host 挂载过。Retire DEFAULT_DISPATCHER_ROUTES and the stale graphql entry in ApiRoutesSchema (spec-major) — #3563 follow-up #3586 删掉的 DEFAULT_DISPATCHER_ROUTES 注释里就写着它属于 "routes that never existed"。

这不是从谁手上拿走东西 —— 它承诺的能力早就活在别处,而且已经好几个 major 了:

承诺 实际活着的机制
记录状态机 state_machine 验证规则(StateMachineSchema 仍然可授权在 object 上)
审批 flow 的 Approval 节点 + approvals runtime(ADR-0019 已把独立审批流程折进 Flow)
记录触发的自动化 生命周期 hook + record_change flow(service-automation)

所以这里没有"要先建的功能",只有三个已存在机制的第四个名字。ADR-0115 D5 授权在 17.x rc 窗口内直接切,不设弃用期。

一并清掉的 graphql 残留

graphql 根本不是 CoreServiceName —— 没有东西能占据这个槽位,条目本身不可达 —— 但它声明了一条 dispatcher 早已作为"不在产品计划内"删除的路径(http-dispatcher.ts: // /graphql removed — GraphQL is not in the product plan,#2462 follow-on)。它能一直没人管,是因为 provider 守卫只校验"每个槽位都有条目",从不校验"每个条目都是槽位"。

退役套件

.claude/skills/spec-property-retirement 走完:

  • 迁移登记:workflow-service-slot-retired SemanticMigration 挂在 major-17 步骤上,FROM → TO 进入 spec-changes.json、生成的 upgrade guide 和 spec_changes MCP 工具;
  • 无 load-path 转换:这些是 TS/API 面和 discovery 响应字段,从不存进 stack 元数据,所以没有源可重写,os migrate meta 无事可做;
  • 基线行按第三条路线删除:21 行 authorable-surface.json + 7 个 json-schema.manifest.json 条目刻意删除,遵循 plugin-runtime 先例 —— retiredKey() 的价值在于让作者在能到达的 parse 上收到处方,而这些形态已经没有任何东西再 parse,处方无人可收即是噪音;
  • changeset:spec/client major,runtime/metadata-protocol minor,携带完整 FROM → TO 与一行修复;
  • 文档:v17 release notes 的 Dead spec clusters removed 表 + 升级清单、services-checklist(从 "Still open" 移除并说明去向)、http-protocol 示例(顺带修掉示例里同样虚构的 graphql 路由)。

os explain workflow 保留为 redirect 条目而非删除,与 content/docs/automation/workflows.mdx 的处理一致 —— 它原本在教一个 spec 里从来不存在的形态(states[] / transitions[] / approvers),现在改为指向三个真实机制。

被 gate 抓住三次,都走了正路

  1. json-schema.manifest.json 绊线 —— 7 个 schema "disappeared";
  2. authorable-surface.json 21 个 key vanish —— 按 §2 的第三条路线(没人 parse ⇒ 删基线并在 changeset 里说明);
  3. provider 守卫把注释里带引号的 'workflow' 读成了枚举成员 —— 它的解析器抓 CoreServiceName 块内所有单引号 token,注释也算。改用反引号并在原地留了注记,免得下一个人重踩。

全仓 pnpm build 的 tsc 清扫是主要的消费者扫雷手段(退役套件 §1 的做法),它找出了 StateMachineSchema 变成未使用 import 这类 grep 抓不到的点。

验证

关联:#4451#4318(PR #4448)、ADR-0115 Evidence 5 / D5、ADR-0019、ADR-0049、ADR-0078、#3586#2462


Generated by Claude Code

claude added 2 commits August 1, 2026 08:58
… service slot and the stray graphql entry (#4451)

The `workflow` slot was ADR-0078's silently-inert declaration at every layer
at once, and had been since it was written: a `CoreServiceName` nothing ever
registered or resolved, an `IWorkflowService` contract with zero
implementations, a `WorkflowProtocol` whose three methods no code ever
provided, an `ApiRoutes.workflow` field no builder could truthfully populate,
and an `/api/v1/workflow` advertisement for a path no host ever mounted. The
pre-#3586 `DEFAULT_DISPATCHER_ROUTES` already listed that path among "routes
that never existed"; ADR-0115 Evidence 5 verified the slot itself across both
repositories — "no code in this repository resolves either slot", the only
touches being plugin-dev's since-retired stub probe and the generic discovery
walk.

Nothing here is being taken away from anyone, because the capability the slot
promised has been live elsewhere for majors: record state machines are
enforced by the `state_machine` validation rule (`StateMachineSchema` stays
authorable on the object), approvals are first-class flow nodes on the
approvals runtime (ADR-0019 folded the standalone approval process into Flow),
and record-triggered automation is lifecycle hooks + `record_change` flows.
That is why this is a removal rather than an enforcement: there is no feature
to build, only a second name for three that exist.

Removed with it: the `graphql` entry in `CORE_SERVICE_PROVIDER` and the
`graphql: { route: '/graphql' }` discovery entry. `graphql` was never a
`CoreServiceName` — so nothing could occupy the slot and the entry was
unreachable — and it declared a path the dispatcher had already dropped as out
of the product plan (#2462 follow-on). The provider guard only checks that
every SLOT has an entry, never that every entry is a slot, which is how the
stray sat unchallenged.

Direct cut inside the 17.x rc window, per ADR-0115 D5. The retirement kit: a
`workflow-service-slot-retired` SemanticMigration on the major-17 step carries
the FROM -> TO into spec-changes.json, the generated upgrade guide and the
`spec_changes` MCP tool. These are TS/API surfaces and discovery RESPONSE
fields — never stored in stack metadata — so there is no load-path conversion
and nothing for `os migrate meta` to rewrite. The 21 `authorable-surface.json`
baseline lines and 7 `json-schema.manifest.json` entries are dropped
deliberately in the same change, following the plugin-runtime precedent: a
`retiredKey()` prescription earns its keep at a parse the author reaches, and
nothing parses these shapes any more.

`os explain workflow` is kept as a redirect topic rather than deleted, mirroring
content/docs/automation/workflows.mdx. It had been teaching a shape the spec
never had (`states[]` / `transitions[]` / `approvers`); it now names the three
live mechanisms instead.
@vercel

vercel Bot commented Aug 1, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 1, 2026 9:49am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:system tests tooling labels Aug 1, 2026
@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 5 package(s): @objectstack/cli, @objectstack/client, @objectstack/metadata-protocol, @objectstack/runtime, @objectstack/spec.

119 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via packages/cli, packages/client, @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/cli, @objectstack/client, packages/runtime, @objectstack/spec)
  • content/docs/api/data-flow.mdx (via @objectstack/cli, @objectstack/client)
  • content/docs/api/environment-routing.mdx (via @objectstack/cli, @objectstack/client, @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/cli, @objectstack/client, @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/api/wire-format.mdx (via @objectstack/runtime)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/cli, @objectstack/runtime, packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via @objectstack/metadata-protocol, @objectstack/runtime, packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/runtime, packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/backup-restore.mdx (via @objectstack/cli)
  • content/docs/deployment/cli.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/deployment/index.mdx (via @objectstack/runtime)
  • content/docs/deployment/production-readiness.mdx (via @objectstack/runtime)
  • content/docs/deployment/self-hosting.mdx (via @objectstack/cli)
  • content/docs/deployment/single-project-mode.mdx (via @objectstack/runtime)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via packages/cli, @objectstack/spec)
  • content/docs/deployment/vercel.mdx (via @objectstack/runtime)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/cli, @objectstack/client, @objectstack/runtime, @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via packages/cli, packages/client)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/cli, packages/client, packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/metadata-protocol, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authentication.mdx (via @objectstack/cli, @objectstack/client, @objectstack/runtime)
  • content/docs/permissions/authorization.mdx (via packages/runtime, @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/cli, @objectstack/client, @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/runtime)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/protocol/kernel/realtime-protocol.mdx (via @objectstack/cli, @objectstack/client)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/cli, @objectstack/client, @objectstack/runtime, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/cli, @objectstack/client, @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/metadata-protocol, @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@github-actions github-actions Bot added the size/l label Aug 1, 2026
claude and others added 3 commits August 1, 2026 09:07
The docs-drift check on PR #4473 earned its keep: my symbol-shaped grep
(`IWorkflowService`, `WorkflowProtocol`, `api/v1/workflow`) found three pages
and missed four PROSE mentions that describe the same retired slot in words.

- `api/plugin-endpoints.mdx` documented three `/workflow/*` routes under a
  "not yet mounted … return 404 today" caveat. The caveat was already the
  tell: routes that 404 for the whole life of the declaration are not "not
  yet", and the slot behind them is gone now. The section becomes a redirect
  naming the three live mechanisms.
- `kernel/services-checklist.mdx` carried it in three more places — the
  legend's 36-method count (now 33), the `null`-provider explanation, and a
  full "6. workflow Service" section still describing the three methods as
  pending rather than removed.

The remaining `workflow` hits in `content/docs` are the ordinary English word
(approval workflow, build workflow, GitHub Actions workflows) and stay.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/l tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

discovery 的 workflow / graphql 槽位还声明着两条无人挂载的 route —— #4318 同款,但目前"上了膛没击发"

2 participants